﻿using IdentityServer4.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
//using PwdIdentityServer.Models;
using IdentityServer4.Test;
using System.Security.Claims;
using IdentityModel;

namespace PwdIdentityServer
{
    public static class Config
    {
        public static IEnumerable<IdentityResource> GetIdentityResources()
        {
            return new IdentityResource[]
            {
                new IdentityResources.OpenId()
            };
        }

        public static IEnumerable<ApiResource> GetApis()
        {
            return new List<ApiResource>
            {
                new ApiResource("api1", "My API")
            };
        }

        public static IEnumerable<ApiScope> ApiScopes()
        {

            return new List<ApiScope>
            {
                   new ApiScope("api1", "My API",new List<string>(){JwtClaimTypes.Role })
            };
        }

        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>
            {

               new Client
                {
                    ClientId = "client_pwd",
                    AbsoluteRefreshTokenLifetime=600,
                    // 密码模式授权，使用ResourceOwnerPassword进行身份验证
                    AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
                    //用来身份认证的 secret，防止泄露
                    ClientSecrets =
                    {
                        new Secret("secret_pwd".Sha256())
                    },
                    AllowOfflineAccess=true,
                    // 允许访问的客户端
                    AllowedScopes = { "api1" }
                }
            };

            //然后去Startup配置  IdentityServer
        }

//        密码凭证模式返回的Claim的数量信息要多一些，但是客户端模式返回的明显少了一些，
//            这是因为客户端不涉及用户信息。所以资源密码凭证模式

//可以根据用户信息做具体的资源权限判断。

//比如，在TestUser有一个Claims属性，允许自已添加Claim，有一个ClaimTypes枚举列出了可以直接添加的Claim。
//            所以我们可以为用户设置角色，来判断角色的权限功能，做简单的权限管理。
        public static List<TestUser> GetUser()
        {
            return new List<TestUser>
            {
                new TestUser
                {
                    SubjectId="1",
                    Username="test_admin",
                    Password="admin123456",
                    Claims=new Claim[]
                    {
                        new Claim(ClaimTypes.Role,"superadmin")
                    }
                }
            };
        }
    }
}
